package main

import (
	"encoding/json"
	"fmt"
)

/*
在Go中，JSON转化前后的数据类型映射如下。
布尔值转化为JSON后还是布尔类型。
浮点数和整型会被转化为JSON里边的常规数字。
字符串将以UTF-8编码转化输出为Unicode字符集的字符串，特殊字符比如<将会被转义为\u003c。
数组和切片会转化为JSON里边的数组，但[]byte类型的值将会被转化为 Base64 编码后
	的字符串，slice类型的零值会被转化为 null。
结构体会转化为JSON对象，并且只有结构体里边以大写字母开头的可被导出的字段才会
	被转化输出，而这些可导出的字段会作为JSON对象的字符串索引。
转化一个map类型的数据结构时，该数据的类型必须是 map[string]T（T可以是
	encoding/json 包支持的任意数据类型）。
*/

/*
 编码为JSON格式
使用json.Marshal()函数可以对一组数据进行JSON格式的编码。json.Marshal()函数
的声明如下：
func Marshal(v interface{}) ([]byte, error)
*/
type book struct {
	Title       string
	Authors     []string
	Publisher   string
	IsPublished bool
	Price       float64
	B           *book
}

// 结构体转json字符串
func structToJsonString() {
	authors := []string{"XuShiwei", "HughLv", "Pandaman", "GuaguaSong", "HanTuo", "BertYuan", "XuDaoli"}
	gobook := book{"Go语言编程", authors, "ituring.com.cn", true, 9.9, nil}
	gobook2 := book{"Go语言编程", authors, "ituring.com.cn", true, 9.9, nil}
	gobook.B = &gobook2
	b, err := json.Marshal(&gobook)
	if err == nil {
		s := string(b)
		fmt.Println(s)
	}
}

// json字符串转结构体
func jsonToStruct() {
	s := "{\"Title\":\"Go语言编程\",\"Authors\":[\"XuShiwei\",\"HughLv\",\"Pandaman\",\"GuaguaSong\",\"HanTuo\",\"BertYuan\",\"XuDaoli\"],\"Publisher\":\"ituring.com.cn\",\"IsPublished\":true,\"Price\":9.9}"
	var book Book
	err := json.Unmarshal([]byte(s), &book)
	if err == nil {
		fmt.Println(book)
	}

}

func main32() {
	structToJsonString()
	//jsonToStruct()
}
